home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / drivers / sidepckt.c < prev    next >
C/C++ Source or Header  |  2000-04-04  |  16KB  |  491 lines

  1. /***************************************************************************
  2.  
  3. Side Pocket - (c) 1986 Data East
  4.  
  5. The original board has an 8751 protection mcu
  6.  
  7. Ernesto Corvi
  8. ernesto@imagina.com
  9.  
  10. Thanks must go to Mirko Buffoni for testing the music.
  11.  
  12. i8751 protection simluation and other fixes by Bryan McPhail, 15/10/00.
  13.  
  14. ***************************************************************************/
  15.  
  16. #include "driver.h"
  17. #include "vidhrdw/generic.h"
  18. #include "cpu/m6809/m6809.h"
  19. #include "cpu/m6502/m6502.h"
  20.  
  21. /* from vidhrdw */
  22. void sidepckt_vh_convert_color_prom(unsigned char *palette, unsigned short *colortable,const unsigned char *color_prom);
  23. int sidepckt_vh_start(void);
  24. void sidepckt_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh);
  25.  
  26. WRITE_HANDLER( sidepckt_flipscreen_w );
  27. WRITE_HANDLER( sidepckt_videoram_w );
  28. WRITE_HANDLER( sidepckt_colorram_w );
  29. static int i8751_return;
  30.  
  31.  
  32. static WRITE_HANDLER( sound_cpu_command_w )
  33. {
  34.     soundlatch_w(offset,data);
  35.     cpu_cause_interrupt(1,M6502_INT_NMI);
  36. }
  37.  
  38. static READ_HANDLER( sidepckt_i8751_r )
  39. {
  40.     return i8751_return;
  41. }
  42.  
  43. static WRITE_HANDLER( sidepckt_i8751_w )
  44. {
  45.     int table_1[]={5,3,2};
  46.     int table_2[]={0x8e,0x42,0xad,0x58,0xec,0x85,0xdd,0x4c,0xad,0x9f,0x00,0x4c,0x7e,0x42,0xa2,0xff};
  47.     int table_3[]={0xbd,0x73,0x80,0xbd,0x73,0xa7,0xbd,0x73,0xe0,0x7e,0x72,0x56,0xff,0xff,0xff,0xff};
  48.     static int current_ptr=0,current_table=0,in_math=0,math_param;
  49.  
  50.     cpu_cause_interrupt(0,M6809_INT_FIRQ); /* i8751 triggers FIRQ on main cpu */
  51.  
  52.     /* This function takes multiple parameters */
  53.     if (in_math==1) {
  54.         in_math=2;
  55.         i8751_return=math_param=data;
  56.     }
  57.     else if (in_math==2) {
  58.         in_math=0;
  59.         i8751_return=math_param/data;
  60.     }
  61.     else switch (data) {
  62.         case 1: /* ID Check */
  63.             current_table=1; current_ptr=0; i8751_return=table_1[current_ptr++]; break;
  64.  
  65.         case 2: /* Protection data (executable code) */
  66.             current_table=2; current_ptr=0; i8751_return=table_2[current_ptr++]; break;
  67.  
  68.         case 3: /* Protection data (executable code) */
  69.             current_table=3; current_ptr=0; i8751_return=table_3[current_ptr++]; break;
  70.  
  71.         case 4: /* Divide function - multiple parameters */
  72.             in_math=1;
  73.             i8751_return=4;
  74.             break;
  75.  
  76.         case 6: /* Read table data */
  77.             if (current_table==1) i8751_return=table_1[current_ptr++];
  78.             if (current_table==2) i8751_return=table_2[current_ptr++];
  79.             if (current_table==3) i8751_return=table_3[current_ptr++];
  80.             break;
  81.     }
  82. }
  83.  
  84. static WRITE_HANDLER( sidepctj_i8751_w )
  85. {
  86.     int table_1[]={5,3,0};
  87.     int table_2[]={0x8e,0x42,0xb2,0x58,0xec,0x85,0xdd,0x4c,0xad,0x9f,0x00,0x4c,0x7e,0x42,0xa7,0xff};
  88.     int table_3[]={0xbd,0x71,0xc8,0xbd,0x71,0xef,0xbd,0x72,0x28,0x7e,0x70,0x9e,0xff,0xff,0xff,0xff};
  89.     static int current_ptr=0,current_table=0,in_math,math_param;
  90.  
  91.     cpu_cause_interrupt(0,M6809_INT_FIRQ); /* i8751 triggers FIRQ on main cpu */
  92.  
  93.     /* This function takes multiple parameters */
  94.     if (in_math==1) {
  95.         in_math=2;
  96.         i8751_return=math_param=data;
  97.     }
  98.     else if (in_math==2) {
  99.         in_math=0;
  100.         i8751_return=math_param/data;
  101.     }
  102.     else switch (data) {
  103.         case 1: /* ID Check */
  104.             current_table=1; current_ptr=0; i8751_return=table_1[current_ptr++]; break;
  105.  
  106.         case 2: /* Protection data */
  107.             current_table=2; current_ptr=0; i8751_return=table_2[current_ptr++]; break;
  108.  
  109.         case 3: /* Protection data (executable code) */
  110.             current_table=3; current_ptr=0; i8751_return=table_3[current_ptr++]; break;
  111.  
  112.         case 4: /* Divide function - multiple parameters */
  113.             in_math=1;
  114.             i8751_return=4;
  115.             break;
  116.  
  117.         case 6: /* Read table data */
  118.             if (current_table==1) i8751_return=table_1[current_ptr++];
  119.             if (current_table==2) i8751_return=table_2[current_ptr++];
  120.             if (current_table==3) i8751_return=table_3[current_ptr++];
  121.             break;
  122.     }
  123. }
  124.  
  125. /******************************************************************************/
  126.  
  127. static struct MemoryReadAddress readmem[] =
  128. {
  129.     { 0x0000, 0x0fff, MRA_RAM },
  130.     { 0x1000, 0x17ff, videoram_r },
  131.     { 0x1800, 0x1fff, colorram_r },
  132.     { 0x2000, 0x20ff, MRA_RAM },
  133.     { 0x3000, 0x3000, input_port_0_r },
  134.     { 0x3001, 0x3001, input_port_1_r },
  135.     { 0x3002, 0x3002, input_port_2_r },
  136.     { 0x3003, 0x3003, input_port_3_r },
  137.     { 0x3014, 0x3014, sidepckt_i8751_r },
  138.     { 0x4000, 0xffff, MRA_ROM },
  139.     { -1 }  /* end of table */
  140. };
  141.  
  142. static struct MemoryWriteAddress writemem[] =
  143. {
  144.     { 0x0000, 0x0fff, MWA_RAM },
  145.     { 0x1000, 0x13ff, sidepckt_videoram_w, &videoram, &videoram_size },
  146.     { 0x1800, 0x1bff, sidepckt_colorram_w, &colorram },
  147.     { 0x2000, 0x20ff, MWA_RAM, &spriteram, &spriteram_size },
  148.     { 0x3004, 0x3004, sound_cpu_command_w },
  149.     { 0x300c, 0x300c, sidepckt_flipscreen_w },
  150.     { 0x3018, 0x3018, sidepckt_i8751_w },
  151.     { 0x4000, 0xffff, MWA_ROM },
  152.     { -1 }  /* end of table */
  153. };
  154.  
  155. static struct MemoryWriteAddress j_writemem[] =
  156. {
  157.     { 0x0000, 0x0fff, MWA_RAM },
  158.     { 0x1000, 0x13ff, sidepckt_videoram_w, &videoram, &videoram_size },
  159.     { 0x1800, 0x1bff, sidepckt_colorram_w, &colorram },
  160.     { 0x2000, 0x20ff, MWA_RAM, &spriteram, &spriteram_size },
  161.     { 0x3004, 0x3004, sound_cpu_command_w },
  162.     { 0x300c, 0x300c, sidepckt_flipscreen_w },
  163.     { 0x3018, 0x3018, sidepctj_i8751_w },
  164.     { 0x4000, 0xffff, MWA_ROM },
  165.     { -1 }  /* end of table */
  166. };
  167.  
  168. static struct MemoryReadAddress sound_readmem[] =
  169. {
  170.     { 0x0000, 0x0fff, MRA_RAM },
  171.     { 0x3000, 0x3000, soundlatch_r },
  172.     { 0x8000, 0xffff, MRA_ROM },
  173.     { -1 }  /* end of table */
  174. };
  175.  
  176. static struct MemoryWriteAddress sound_writemem[] =
  177. {
  178.     { 0x0000, 0x0fff, MWA_RAM },
  179.     { 0x1000, 0x1000, YM2203_control_port_0_w },
  180.     { 0x1001, 0x1001, YM2203_write_port_0_w },
  181.     { 0x2000, 0x2000, YM3526_control_port_0_w },
  182.     { 0x2001, 0x2001, YM3526_write_port_0_w },
  183.     { 0x8000, 0xffff, MWA_ROM },
  184.     { -1 }  /* end of table */
  185. };
  186.  
  187. /******************************************************************************/
  188.  
  189. INPUT_PORTS_START( sidepckt )
  190.     PORT_START /* 0x3000 */
  191.     PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY )
  192.     PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_8WAY )
  193.     PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_8WAY )
  194.     PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_8WAY )
  195.     PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 )
  196.     PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 )
  197.     PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START1 )
  198.     PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START2 )
  199.  
  200.     PORT_START /* 0x3001 */
  201.     /* I haven't found a way to make the game use the 2p controls */
  202.     PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT | IPF_8WAY | IPF_COCKTAIL )
  203.     PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT | IPF_8WAY | IPF_COCKTAIL )
  204.     PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP | IPF_8WAY | IPF_COCKTAIL )
  205.     PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN | IPF_8WAY | IPF_COCKTAIL )
  206.     PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 | IPF_COCKTAIL )
  207.     PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 | IPF_COCKTAIL )
  208.     PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN2 )
  209.     PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN1 )
  210.  
  211.     PORT_START /* 0x3002 */
  212.     PORT_DIPNAME( 0x03, 0x03, DEF_STR( Coin_B ) )
  213.     PORT_DIPSETTING(    0x03, DEF_STR( 1C_2C ) )
  214.     PORT_DIPSETTING(    0x02, DEF_STR( 1C_3C ) )
  215.     PORT_DIPSETTING(    0x01, DEF_STR( 1C_4C ) )
  216.     PORT_DIPSETTING(    0x00, DEF_STR( 1C_6C ) )
  217.     PORT_DIPNAME( 0x0c, 0x0c, DEF_STR( Coin_A ) )
  218.     PORT_DIPSETTING(    0x00, DEF_STR( 4C_1C ) )
  219.     PORT_DIPSETTING(    0x04, DEF_STR( 3C_1C ) )
  220.     PORT_DIPSETTING(    0x08, DEF_STR( 2C_1C ) )
  221.     PORT_DIPSETTING(    0x0c, DEF_STR( 1C_1C ) )
  222.     PORT_DIPNAME( 0x10, 0x10, "Unused?" )
  223.     PORT_DIPSETTING(    0x10, DEF_STR( Off ) )
  224.     PORT_DIPSETTING(    0x00, DEF_STR( On ) )
  225.     PORT_DIPNAME( 0x20, 0x20, "Unused?" )
  226.     PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
  227.     PORT_DIPSETTING(    0x00, DEF_STR( On ) )
  228.     PORT_DIPNAME( 0x40, 0x40, DEF_STR( Demo_Sounds ) )
  229.     PORT_DIPSETTING(    0x00, DEF_STR( Off ) )
  230.     PORT_DIPSETTING(    0x40, DEF_STR( On ) )
  231.     PORT_DIPNAME( 0x80, 0x80, "Unused?" )
  232.     PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
  233.     PORT_DIPSETTING(    0x00, DEF_STR( On ) )
  234.  
  235.     PORT_START /* 0x3003 */
  236.     PORT_DIPNAME( 0x03, 0x03, "Timer Speed" )
  237.     PORT_BITX( 0,       0x00, IPT_DIPSWITCH_SETTING | IPF_CHEAT, "Stopped", IP_KEY_NONE, IP_JOY_NONE )
  238.     PORT_DIPSETTING(    0x03, "Slow" )
  239.     PORT_DIPSETTING(    0x02, "Medium" )
  240.     PORT_DIPSETTING(    0x01, "Fast" )
  241.     PORT_DIPNAME( 0x0c, 0x08, DEF_STR( Lives ) )
  242.     PORT_DIPSETTING(    0x04, "2" )
  243.     PORT_DIPSETTING(    0x08, "3" )
  244.     PORT_DIPSETTING(    0x0c, "6" )
  245.     PORT_BITX( 0,       0x00, IPT_DIPSWITCH_SETTING | IPF_CHEAT, "Infinite", IP_KEY_NONE, IP_JOY_NONE )
  246.     PORT_DIPNAME( 0x30, 0x00, DEF_STR( Unknown ) )
  247.     PORT_DIPSETTING(    0x00, "0" )
  248.     PORT_DIPSETTING(    0x10, "1" )
  249.     PORT_DIPSETTING(    0x20, "2" )
  250.     PORT_DIPSETTING(    0x30, "3" )
  251.     PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_COIN3 )
  252.     PORT_DIPNAME( 0x80, 0x80, "Unused?" )
  253.     PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
  254.     PORT_DIPSETTING(    0x00, DEF_STR( On ) )
  255. INPUT_PORTS_END
  256.  
  257.  
  258.  
  259. static struct GfxLayout charlayout =
  260. {
  261.     8,8,    /* 8*8 characters */
  262.     2048,   /* 2048 characters */
  263.     3,      /* 3 bits per pixel */
  264.     { 0, 0x8000*8, 0x10000*8 },     /* the bitplanes are separated */
  265.     { 0, 1, 2, 3, 4, 5, 6, 7 },
  266.     { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
  267.     8*8     /* every char takes 8 consecutive bytes */
  268. };
  269.  
  270. static struct GfxLayout spritelayout =
  271. {
  272.     16,16,  /* 16*16 sprites */
  273.     1024,   /* 1024 sprites */
  274.     3,      /* 3 bits per pixel */
  275.     { 0, 0x8000*8, 0x10000*8 },     /* the bitplanes are separated */
  276.     { 128+0, 128+1, 128+2, 128+3, 128+4, 128+5, 128+6, 128+7, 0, 1, 2, 3, 4, 5, 6, 7 },
  277.     { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8, 8*8, 9*8, 10*8, 11*8, 12*8, 13*8, 14*8, 15*8 },
  278.     32*8    /* every char takes 8 consecutive bytes */
  279. };
  280.  
  281. static struct GfxDecodeInfo gfxdecodeinfo[] =
  282. {
  283.     { REGION_GFX1, 0, &charlayout,   128,  4 },    /* colors 128-159 */
  284.     { REGION_GFX2, 0, &spritelayout,   0, 16 },    /* colors   0-127 */
  285.     { -1 } /* end of array */
  286. };
  287.  
  288.  
  289.  
  290. /* handler called by the 3526 emulator when the internal timers cause an IRQ */
  291. static void irqhandler(int linestate)
  292. {
  293.     cpu_set_irq_line(1,0,linestate);
  294. }
  295.  
  296. static struct YM2203interface ym2203_interface =
  297. {
  298.     1,      /* 1 chip */
  299.     1500000,        /* 1.5 MHz */
  300.     { YM2203_VOL(25,25) },
  301.     { 0 },
  302.     { 0 },
  303.     { 0 },
  304.     { 0 }
  305. };
  306.  
  307. static struct YM3526interface ym3526_interface =
  308. {
  309.     1,            /* 1 chip */
  310.     3000000,    /* 3 MHz */
  311.     { 25 },        /* volume */
  312.     { irqhandler},
  313. };
  314.  
  315.  
  316.  
  317. static struct MachineDriver machine_driver_sidepckt =
  318. {
  319.     /* basic machine hardware */
  320.     {
  321.         {
  322.             CPU_M6809,
  323.             2000000,        /* 2 MHz */
  324.             readmem,writemem,0,0,
  325.             nmi_interrupt,1
  326.         },
  327.         {
  328.             CPU_M6502 | CPU_AUDIO_CPU,
  329.             1500000,        /* 1.5 MHz */
  330.             sound_readmem,sound_writemem,0,0,
  331.             ignore_interrupt,0    /* IRQs are triggered by the YM3526 */
  332.                                 /* NMIs are triggered by the main cpu */
  333.         }
  334.     },
  335.     58, DEFAULT_REAL_60HZ_VBLANK_DURATION,  /* VERIFY:  May be 55 or 56 */
  336.     1, /* 1 CPU slice per frame - interleaving is forced when a sound command is written */
  337.     0,
  338.  
  339.     /* video hardware */
  340.     32*8, 32*8, { 0*8, 32*8-1, 2*8, 30*8-1 },
  341.     gfxdecodeinfo,
  342.     256, 256,
  343.     sidepckt_vh_convert_color_prom,
  344.  
  345.     VIDEO_TYPE_RASTER,// | VIDEO_SUPPORTS_DIRTY, tilemaps don't support dirty
  346.     0,
  347.     sidepckt_vh_start,
  348.     generic_vh_stop,
  349.     sidepckt_vh_screenrefresh,
  350.  
  351.     /* sound hardware */
  352.     0,0,0,0,
  353.     {
  354.         {
  355.             SOUND_YM2203,
  356.             &ym2203_interface
  357.         },
  358.         {
  359.             SOUND_YM3526,
  360.             &ym3526_interface
  361.         }
  362.     }
  363. };
  364.  
  365. static struct MachineDriver machine_driver_sidepctj =
  366. {
  367.     /* basic machine hardware */
  368.     {
  369.         {
  370.             CPU_M6809,
  371.             2000000,        /* 2 MHz */
  372.             readmem,j_writemem,0,0,
  373.             nmi_interrupt,1
  374.         },
  375.         {
  376.             CPU_M6502 | CPU_AUDIO_CPU,
  377.             1500000,        /* 1.5 MHz */
  378.             sound_readmem,sound_writemem,0,0,
  379.             ignore_interrupt,0    /* IRQs are triggered by the YM3526 */
  380.                                 /* NMIs are triggered by the main cpu */
  381.         }
  382.     },
  383.     58, DEFAULT_REAL_60HZ_VBLANK_DURATION,  /* VERIFY:  May be 55 or 56 */
  384.     1, /* 1 CPU slice per frame - interleaving is forced when a sound command is written */
  385.     0,
  386.  
  387.     /* video hardware */
  388.     32*8, 32*8, { 0*8, 32*8-1, 2*8, 30*8-1 },
  389.     gfxdecodeinfo,
  390.     256, 256,
  391.     sidepckt_vh_convert_color_prom,
  392.  
  393.     VIDEO_TYPE_RASTER,// | VIDEO_SUPPORTS_DIRTY, tilemaps don't support dirty
  394.     0,
  395.     sidepckt_vh_start,
  396.     generic_vh_stop,
  397.     sidepckt_vh_screenrefresh,
  398.  
  399.     /* sound hardware */
  400.     0,0,0,0,
  401.     {
  402.         {
  403.             SOUND_YM2203,
  404.             &ym2203_interface
  405.         },
  406.         {
  407.             SOUND_YM3526,
  408.             &ym3526_interface
  409.         }
  410.     }
  411. };
  412.  
  413. /***************************************************************************
  414.  
  415.   Game driver(s)
  416.  
  417. ***************************************************************************/
  418.  
  419. ROM_START( sidepckt )
  420.     ROM_REGION( 0x10000, REGION_CPU1 )     /* 64k for code */
  421.     ROM_LOAD( "dh00",         0x00000, 0x10000, 0x251b316e )
  422.  
  423.     ROM_REGION( 0x10000, REGION_CPU2 )     /* 64k for the audio cpu */
  424.     ROM_LOAD( "dh04.bin",     0x08000, 0x8000, 0xd076e62e )
  425.  
  426.     ROM_REGION( 0x18000, REGION_GFX1 | REGIONFLAG_DISPOSE )
  427.     ROM_LOAD( "sp_07.bin",    0x00000, 0x8000, 0x9d6f7969 ) /* characters */
  428.     ROM_LOAD( "sp_06.bin",    0x08000, 0x8000, 0x580e4e43 )
  429.     ROM_LOAD( "sp_05.bin",    0x10000, 0x8000, 0x05ab71d2 )
  430.  
  431.     ROM_REGION( 0x18000, REGION_GFX2 | REGIONFLAG_DISPOSE )
  432.     ROM_LOAD( "dh01.bin",     0x00000, 0x8000, 0xa2cdfbea ) /* sprites */
  433.     ROM_LOAD( "dh02.bin",     0x08000, 0x8000, 0xeeb5c3e7 )
  434.     ROM_LOAD( "dh03.bin",     0x10000, 0x8000, 0x8e18d21d )
  435.  
  436.     ROM_REGION( 0x0200, REGION_PROMS )    /* color PROMs */
  437.     ROM_LOAD( "dh-09.bpr",    0x0000, 0x0100, 0xce049b4f )
  438.     ROM_LOAD( "dh-08.bpr",    0x0100, 0x0100, 0xcdf2180f )
  439. ROM_END
  440.  
  441. ROM_START( sidepctj )
  442.     ROM_REGION( 0x10000, REGION_CPU1 )     /* 64k for code */
  443.     ROM_LOAD( "dh00.bin",     0x00000, 0x10000, 0xa66bc28d )
  444.  
  445.     ROM_REGION( 0x10000, REGION_CPU2 )     /* 64k for the audio cpu */
  446.     ROM_LOAD( "dh04.bin",     0x08000, 0x8000, 0xd076e62e )
  447.  
  448.     ROM_REGION( 0x18000, REGION_GFX1 | REGIONFLAG_DISPOSE )
  449.     ROM_LOAD( "dh07.bin",     0x00000, 0x8000, 0x7d0ce858 ) /* characters */
  450.     ROM_LOAD( "dh06.bin",     0x08000, 0x8000, 0xb86ddf72 )
  451.     ROM_LOAD( "dh05.bin",     0x10000, 0x8000, 0xdf6f94f2 )
  452.  
  453.     ROM_REGION( 0x18000, REGION_GFX2 | REGIONFLAG_DISPOSE )
  454.     ROM_LOAD( "dh01.bin",     0x00000, 0x8000, 0xa2cdfbea ) /* sprites */
  455.     ROM_LOAD( "dh02.bin",     0x08000, 0x8000, 0xeeb5c3e7 )
  456.     ROM_LOAD( "dh03.bin",     0x10000, 0x8000, 0x8e18d21d )
  457.  
  458.     ROM_REGION( 0x0200, REGION_PROMS )    /* color PROMs */
  459.     ROM_LOAD( "dh-09.bpr",    0x0000, 0x0100, 0xce049b4f )
  460.     ROM_LOAD( "dh-08.bpr",    0x0100, 0x0100, 0xcdf2180f )
  461. ROM_END
  462.  
  463. ROM_START( sidepctb )
  464.     ROM_REGION( 0x10000, REGION_CPU1 )     /* 64k for code */
  465.     ROM_LOAD( "sp_09.bin",    0x04000, 0x4000, 0x3c6fe54b )
  466.     ROM_LOAD( "sp_08.bin",    0x08000, 0x8000, 0x347f81cd )
  467.  
  468.     ROM_REGION( 0x10000, REGION_CPU2 )     /* 64k for the audio cpu */
  469.     ROM_LOAD( "dh04.bin",     0x08000, 0x8000, 0xd076e62e )
  470.  
  471.     ROM_REGION( 0x18000, REGION_GFX1 | REGIONFLAG_DISPOSE )
  472.     ROM_LOAD( "sp_07.bin",    0x00000, 0x8000, 0x9d6f7969 ) /* characters */
  473.     ROM_LOAD( "sp_06.bin",    0x08000, 0x8000, 0x580e4e43 )
  474.     ROM_LOAD( "sp_05.bin",    0x10000, 0x8000, 0x05ab71d2 )
  475.  
  476.     ROM_REGION( 0x18000, REGION_GFX2 | REGIONFLAG_DISPOSE )
  477.     ROM_LOAD( "dh01.bin",     0x00000, 0x8000, 0xa2cdfbea ) /* sprites */
  478.     ROM_LOAD( "dh02.bin",     0x08000, 0x8000, 0xeeb5c3e7 )
  479.     ROM_LOAD( "dh03.bin",     0x10000, 0x8000, 0x8e18d21d )
  480.  
  481.     ROM_REGION( 0x0200, REGION_PROMS )    /* color PROMs */
  482.     ROM_LOAD( "dh-09.bpr",    0x0000, 0x0100, 0xce049b4f )
  483.     ROM_LOAD( "dh-08.bpr",    0x0100, 0x0100, 0xcdf2180f )
  484. ROM_END
  485.  
  486.  
  487.  
  488. GAME( 1986, sidepckt, 0,        sidepckt, sidepckt, 0, ROT0, "Data East Corporation", "Side Pocket (World)" )
  489. GAME( 1986, sidepctj, sidepckt, sidepctj, sidepckt, 0, ROT0, "Data East Corporation", "Side Pocket (Japan)" )
  490. GAME( 1986, sidepctb, sidepckt, sidepckt, sidepckt, 0, ROT0, "bootleg", "Side Pocket (bootleg)" )
  491.